<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1.用for循环实现forEach循环
        // var arr = ["张三", "李四", "王五"]
        // arr.forEach(function(item, index) {
        //     console.log(item, index)
        // })
        // 模拟forEach
        // function myForEach(arr, fn) {
        //     for (var i = 0; i < arr.length; i++) {
        //         fn(arr[i], i, arr)
        //     }
        // }
        // 函数调用
        // myForEach(arr, function(item, index, arr) {
        //     console.log(item, index, arr)
        // })
        // 模拟使用forEach的格式
        // 将myForEach函数挂到Array构造函数原型上
        // Array.prototype.myForEach = function(fn) {
        //     for (var i = 0; i < this.length; i++) {
        //         fn(this[i], i, this)
        //     }
        // }
        // 仿forEach调用
        // arr.myForEach(function(item, index, arr) {
        //     console.log(item, index, arr)
        // })

        // 2.map循环

        // var arr = ["张三", "李四", "王五"]
        // var res = arr.map(function(item, index, arr) {
        //     return item
        // })
        // console.log(res)

        // 2.1 for 循环实现map
        // function myMap(arr, fn) {
        //     var result = []
        //     for (var i = 0; i < arr.length; i++) {
        //         var res = fn(arr[i], i, arr)
        //         result.push(res)
        //     }
        //     return result
        // }
        // var res = myMap(arr, function(item, index, arr) {
        //     console.log(item, index, arr)
        //     return item
        // })
        // 2.2 for循环实现some和every

        // some方法
        // var arr = [false, false, true, true]
        // var res = arr.every(function(item, index, arr) {
        //     return typeof item === 'boolean'
        // })
        // console.log(res)

        // every方法
        // var arr = [false, false, true, true, 1]
        // var res = arr.some(function(item, index, arr) {
        //     return typeof item === 'number'
        // })
        // console.log(res)

        // reduce：累加器

        // 一、数字累加
        // var arr = [1, 2, 3, 4]
        // var res = arr.reduce(function (pre, cur, index) {
        //     return pre + cur
        // }, 0)
        // console.log(res)

        // 二、数组累加
        // var arr = [1, 2, 3, 4]
        // var res = arr.reduce(function(pre, cur, index) {
        //     pre.push(cur + 1)
        //     return pre
        // }, [])
        // console.log(res)

        // 三、对象累加
        // var arr = [1, 2, 3, 4]
        // var res = arr.reduce(function(pre, cur, index) {
        //     pre[cur] = "起飞"
        //     return pre
        // }, {})
        // console.log(res)

        // 通过reduce给数组去重,给重复字符串计数
        let arr = [1, 2, 1, 3, 2, 4, 3, 5, 5]
        let str = 'abcabccaaa'

        // let obj = {}
        // var res = arr.reduce(function (pre, cur, index) {
        //     if (obj[cur] != undefined) {
        //         return pre
        //     }
        //     else if (obj[cur] == undefined) {
        //         obj[cur] = true
        //         pre.push(cur)
        //         return pre
        //     }
        // }, [])
        // console.log(res)

        //给数组重复的字符计数
        // let res = arr.reduce(function(pre, cur, index) {
        //     if (typeof pre[cur] == 'undefined') {
        //         pre[cur] = 1
        //         return pre
        //     }else {
        //         pre[cur]++
        //         return pre
        //     }
        // }, {}) 
        // console.log(res)

        // 给数组去重
        var arr1 = [1,2,1,3,2]
        var res = arr1.reduce(function(pre, cur, index) {
            pre.indexOf(cur) === -1 ? pre.push(cur) : null
            return pre
        }, [])
        console.log(res)

    </script>
</body>

</html>